package com.stars.easyms.mq.annotation;

import com.stars.easyms.mq.enums.DestinationType;
import com.stars.easyms.mq.enums.RedeliveryPolicy;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.lang.annotation.*;

/**
 * 提供mq接收服务的方法注解
 *
 * @author guoguifang
 * @date 2018-04-23 13:54
 * @since 1.0.0
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public @interface MQReceiver {

    /**
     * MQ接收消息的key
     */
    String key();

    /**
     * key所对应的中文名称
     */
    String name();

    /**
     * QUEUE:点对点，不可重复消费
     * TOPIC:发布/订阅，可以重复消费
     */
    DestinationType destinationType() default DestinationType.QUEUE;

    /**
     * 是否批量处理数据，默认是
     */
    boolean batch() default true;

    /**
     * 当使用批量处理数据时是否整体提交或者整体回滚，默认是非整体
     */
    boolean overall() default false;

    /**
     * 通道数量，就是一个相同的KEY使用几个通道发送与接收，发送端和接收端的数值必须一致
     */
    int channelCount() default 1;

    /**
     * 最大失败次数，默认5
     */
    long maxFailCount() default 5;

    /**
     * 消息重新处理机制
     */
    RedeliveryPolicy redeliveryPolicy() default RedeliveryPolicy.EXPONENTIAL;

    /**
     * 消息重发时间间隔(单位:秒)
     */
    long redeliveryDelay() default 60;

    /**
     * key值是否随着环境变化(默认false，如果是true的话key值结尾会增加"_${spring.profiles.active}")
     */
    boolean isDynamicKey() default false;

}
